]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Work around Spidermonkey problem with Unicode date formats
authorOwen W. Taylor <otaylor@fishsoup.net>
Sun, 13 Mar 2011 00:41:23 +0000 (19:41 -0500)
committerOwen W. Taylor <otaylor@fishsoup.net>
Mon, 14 Mar 2011 19:33:44 +0000 (15:33 -0400)
Monkey-patch Date.prototype.toLocaleFormat() with a version that uses
g_date_time_format() since the Spidermonkey built-in can't handle
format strings with Unicode characters.

https://bugzilla.gnome.org/show_bug.cgi?id=643350

js/ui/environment.js
src/shell-util.c
src/shell-util.h

index e832262022a5597e54eebc391e06d799446dd965..9061a7723d9168865f03924a4e136b39fdfadbf0 100644 (file)
@@ -64,6 +64,11 @@ function init() {
     Tweener.init();
     String.prototype.format = Format.format;
 
+    // Work around https://bugzilla.mozilla.org/show_bug.cgi?id=508783
+    Date.prototype.toLocaleFormat = function(format) {
+        return Shell.util_format_date(format, this.getTime());
+    };
+
     // Set the default direction for St widgets (this needs to be done before any use of St)
     if (Gettext_gtk30.gettext('default:LTR') == 'default:RTL') {
         St.Widget.set_default_direction(St.TextDirection.RTL);
index 86cd3a49d3bde34e86b5ae65d4e36b443f98fb5e..d5aec138b2725b4693de3c30cf3ccd7251fc2dc0 100644 (file)
@@ -439,3 +439,42 @@ shell_util_set_hidden_from_pick (ClutterActor *actor,
       g_object_set_data (G_OBJECT (actor), "shell-stop-pick", NULL);
     }
 }
+
+/**
+ * shell_util_format_date:
+ * @format: a strftime-style string format, as parsed by
+ *   g_date_time_format()
+ * @time_ms: milliseconds since 1970-01-01 00:00:00 UTC; the
+ *   value returned by Date.getTime()
+ *
+ * Formats a date for the current locale. This should be
+ * used instead of the Spidermonkey Date.toLocaleFormat()
+ * extension because Date.toLocaleFormat() is buggy for
+ * Unicode format strings:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=508783
+ *
+ * Return value: the formatted date. If the date is
+ *  outside of the range of a GDateTime (which contains
+ *  any plausible dates we actually care about), will
+ *  return an empty string.
+ */
+char *
+shell_util_format_date (const char *format,
+                        gint64      time_ms)
+{
+  GDateTime *datetime;
+  GTimeVal tv;
+  char *result;
+
+  tv.tv_sec = time_ms / 1000;
+  tv.tv_usec = (time_ms % 1000) * 1000;
+
+  datetime = g_date_time_new_from_timeval_local (&tv);
+  if (!datetime) /* time_ms is out of range of GDateTime */
+    return g_strdup ("");
+
+  result = g_date_time_format (datetime, format);
+
+  g_date_time_unref (datetime);
+  return result;
+}
index e6559058868704a52cd34ae5b5d41bdb4c31ca59..e4914c380c30fb3113deb478a0a45fa2e9975f59 100644 (file)
@@ -13,6 +13,9 @@ GIcon *shell_util_get_icon_for_uri (const char *text_uri);
 GIcon *shell_util_icon_from_string (const char *string, GError **error);
 void   shell_util_set_hidden_from_pick (ClutterActor *actor, gboolean hidden);
 
+char *shell_util_format_date (const char *format,
+                              gint64      time_ms);
+
 G_END_DECLS
 
 #endif /* __SHELL_UTIL_H__ */